From fcdec5ac414095e7143ea9721882baa82c52445e Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Fri, 31 Oct 2014 22:28:17 -0400 Subject: [PATCH] icon-browser: Add search Most of the code was already in place, just some loose ends to fix up. --- demos/icon-browser/iconbrowserwin.c | 49 ++++++++++++++++++++--------- demos/icon-browser/window.ui | 6 ++-- 2 files changed, 39 insertions(+), 16 deletions(-) diff --git a/demos/icon-browser/iconbrowserwin.c b/demos/icon-browser/iconbrowserwin.c index 12bd24ff83..39db09661d 100644 --- a/demos/icon-browser/iconbrowserwin.c +++ b/demos/icon-browser/iconbrowserwin.c @@ -1,3 +1,4 @@ +#include #include "iconbrowserapp.h" #include "iconbrowserwin.h" #include @@ -51,7 +52,7 @@ enum { G_DEFINE_TYPE(IconBrowserWindow, icon_browser_window, GTK_TYPE_APPLICATION_WINDOW); static void -search_text_changed (GtkEntry *entry) +search_text_changed (GtkEntry *entry, IconBrowserWindow *win) { const gchar *text; @@ -59,6 +60,8 @@ search_text_changed (GtkEntry *entry) if (text[0] == '\0') return; + + gtk_tree_model_filter_refilter (win->filter_model); } static void @@ -191,6 +194,8 @@ selected_context_changed (GtkListBox *list, IconBrowserWindow *win) if (row == NULL) return; + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (win->search), FALSE); + label = gtk_bin_get_child (GTK_BIN (row)); win->current_context = g_object_get_data (G_OBJECT (label), "context"); gtk_tree_model_filter_refilter (win->filter_model); @@ -671,11 +676,13 @@ populate (IconBrowserWindow *win) } static gboolean -key_press_event_cb (GtkWidget *widget, - GdkEvent *event, - GtkSearchBar *bar) +key_press_event_cb (GtkWidget *widget, + GdkEvent *event, + gpointer data) { - return gtk_search_bar_handle_event (bar, event); + IconBrowserWindow *win = data; + + return gtk_search_bar_handle_event (GTK_SEARCH_BAR (win->searchbar), event); } static gboolean @@ -687,8 +694,13 @@ icon_visible_func (GtkTreeModel *model, gchar *context; gchar *name; gint column; + gboolean search; + const gchar *search_text; gboolean visible; + search = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (win->search)); + search_text = gtk_entry_get_text (GTK_ENTRY (win->searchentry)); + if (win->symbolic) column = SYMBOLIC_NAME_COLUMN; else @@ -698,8 +710,12 @@ icon_visible_func (GtkTreeModel *model, column, &name, CONTEXT_COLUMN, &context, -1); - - visible = name != NULL && win->current_context != NULL && g_strcmp0 (context, win->current_context->id) == 0; + if (!name) + visible = FALSE; + else if (search) + visible = strstr (name, search_text) != NULL; + else + visible = win->current_context != NULL && g_strcmp0 (context, win->current_context->id) == 0; g_free (name); g_free (context); @@ -726,6 +742,13 @@ symbolic_toggled (GtkToggleButton *toggle, IconBrowserWindow *win) gtk_widget_queue_draw (win->list); } +static void +search_mode_toggled (GObject *searchbar, GParamSpec *pspec, IconBrowserWindow *win) +{ + if (gtk_search_bar_get_search_mode (GTK_SEARCH_BAR (searchbar))) + gtk_list_box_unselect_all (GTK_LIST_BOX (win->context_list)); +} + static void icon_browser_window_init (IconBrowserWindow *win) { @@ -733,16 +756,13 @@ icon_browser_window_init (IconBrowserWindow *win) win->contexts = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, g_free); - g_object_bind_property (win->search, "active", - win->searchbar, "search-mode-enabled", - G_BINDING_BIDIRECTIONAL); - -// gtk_tree_view_set_search_entry (GTK_TREE_VIEW (win->list), GTK_ENTRY (win->searchentry)); - g_signal_connect (win, "key-press-event", G_CALLBACK (key_press_event_cb), win->searchbar); - gtk_tree_model_filter_set_visible_func (win->filter_model, icon_visible_func, win, NULL); gtk_window_set_transient_for (GTK_WINDOW (win->details), GTK_WINDOW (win)); + + g_signal_connect (win->searchbar, "notify::search-mode-enabled", + G_CALLBACK (search_mode_toggled), win); + symbolic_toggled (GTK_TOGGLE_BUTTON (win->symbolic_radio), win); populate (win); @@ -778,6 +798,7 @@ icon_browser_window_class_init (IconBrowserWindowClass *class) gtk_widget_class_bind_template_callback (GTK_WIDGET_CLASS (class), item_activated); gtk_widget_class_bind_template_callback (GTK_WIDGET_CLASS (class), selected_context_changed); gtk_widget_class_bind_template_callback (GTK_WIDGET_CLASS (class), symbolic_toggled); + gtk_widget_class_bind_template_callback (GTK_WIDGET_CLASS (class), key_press_event_cb); } IconBrowserWindow * diff --git a/demos/icon-browser/window.ui b/demos/icon-browser/window.ui index 4e49bdc67f..296a1ea09e 100644 --- a/demos/icon-browser/window.ui +++ b/demos/icon-browser/window.ui @@ -16,6 +16,7 @@ Icon Browser 600 800 + True @@ -47,7 +48,7 @@ - False + True @@ -83,10 +84,11 @@ True + - True + -- 2.30.2